import sys
import os
sys.path.insert(0, os.path.abspath('../'))
sys.path.insert(0, os.path.abspath('../../'))
import optuna
from qiskit.algorithms import QAOA
from qiskit_optimization.algorithms import MinimumEigenOptimizer
from shared.graph_helper import *
from shared.QiskitMaxcut import *
from shared.Mitiq_QAOA import *
from ionq.ionq_parameters import *
%matplotlib inline
# ---- Define graph and MaxCut ----
graph = generate_butterfly_graph(with_weights=True)
max_cut = Maxcut(graph)
max_cut_qubo = max_cut.to_qubo()
max_cut.draw()
def init_qaoa(optimizer, reps, init_parameters):
quantum_instance = QuantumInstance(
backend=simulator_backend,
shots=SHOTS,
)
# generate QAOA to get circuit
pre_qaoa = QAOA(optimizer=COBYLA(maxiter=1, tol=0), quantum_instance=quantum_instance, reps=reps, initial_point=init_parameters)
MinimumEigenOptimizer(pre_qaoa).solve(max_cut_qubo)
circuit = pre_qaoa.get_optimal_circuit()
circuit.measure_all()
mitiq_qaoa = Mitiq_QAOA(mitiq_circuit=circuit.copy(),
optimizer=optimizer,
quantum_instance=quantum_instance,
reps=reps,
initial_point=init_parameters)
return mitiq_qaoa
def run(max_cut_problem, qaoa):
# Run quantum algorithm QAOA
algorithm = MinimumEigenOptimizer(qaoa)
result = algorithm.solve(max_cut_problem)
optimal_parameters = qaoa.optimal_params
return result, optimal_parameters.copy()
def objective(trial):
optimizer_name = trial.suggest_categorical("optimizer", optimizers.keys())
reps = trial.suggest_int('reps', REPS_MIN, REPS_MAX)
parameters = []
for i in range(reps):
parameters.append(trial.suggest_uniform(f'gamma_{i}', GAMMA_MIN, GAMMA_MAX))
for i in range(reps):
parameters.append(trial.suggest_uniform(f'beta_{i}', BETA_MIN, BETA_MAX))
optimizer = optimizers[optimizer_name]
qaoa = init_qaoa(optimizer, reps, parameters)
result, optimal_parameters = run(max_cut_qubo, qaoa)
mean, distribution = max_cut.analyse(result)
trial.set_user_attr(key="best", value=[mean,result,optimal_parameters])
return mean
study = optuna.create_study(direction='minimize')
study.optimize(objective, n_trials=N_TRIALS, callbacks=[save_best_trial])
[I 2021-07-28 18:13:43,408] A new study created in memory with name: no-name-9f83f3aa-7a70-4f24-a6f9-edc3598dcbd0 [I 2021-07-28 18:15:10,296] Trial 0 finished with value: -27.893000000000004 and parameters: {'optimizer': 'COBYLA', 'reps': 8, 'gamma_0': -1.2567914611021997, 'gamma_1': -2.923328120889928, 'gamma_2': -2.334348935384091, 'gamma_3': 2.0219271092016227, 'gamma_4': 1.5453798379909172, 'gamma_5': -1.944999293004688, 'gamma_6': 2.5858628163447417, 'gamma_7': -0.42445712020817883, 'beta_0': 0.8455000340017493, 'beta_1': -1.484953735945104, 'beta_2': 0.783716490297818, 'beta_3': -1.809516968683277, 'beta_4': -1.216352667296713, 'beta_5': -2.6392011140632055, 'beta_6': 1.7969934507961671, 'beta_7': -2.781278882050769}. Best is trial 0 with value: -27.893000000000004. [I 2021-07-28 18:16:37,046] Trial 1 finished with value: -26.139999999999993 and parameters: {'optimizer': 'COBYLA', 'reps': 5, 'gamma_0': 0.44790728986541595, 'gamma_1': -2.7540300669017435, 'gamma_2': -1.381593616230636, 'gamma_3': -2.924541599670385, 'gamma_4': 2.7131600807885334, 'beta_0': 0.29990498191754833, 'beta_1': -0.5224433272028515, 'beta_2': -1.491190772327681, 'beta_3': -1.8187684345956994, 'beta_4': 0.5629735328025265}. Best is trial 0 with value: -27.893000000000004. [I 2021-07-28 18:30:20,404] Trial 2 finished with value: -17.734 and parameters: {'optimizer': 'SPSA', 'reps': 4, 'gamma_0': -0.38147816020292513, 'gamma_1': 2.0950189353299287, 'gamma_2': -0.9061498878254417, 'gamma_3': -1.6995560536374446, 'beta_0': -3.1241086528602793, 'beta_1': -1.608982225491061, 'beta_2': -1.4230219108001798, 'beta_3': -0.3842851798421405}. Best is trial 0 with value: -27.893000000000004. [I 2021-07-28 18:31:47,465] Trial 3 finished with value: -25.220000000000002 and parameters: {'optimizer': 'COBYLA', 'reps': 8, 'gamma_0': -1.4118600193279314, 'gamma_1': -2.240464660720517, 'gamma_2': -1.8427921039761395, 'gamma_3': -0.3152794611630769, 'gamma_4': -1.5481915834921216, 'gamma_5': -2.8414953191523526, 'gamma_6': 0.6624702697985341, 'gamma_7': 2.352739457150548, 'beta_0': 2.5375230177815773, 'beta_1': 0.6862741325297663, 'beta_2': -2.7816436941816396, 'beta_3': -1.9120234362425856, 'beta_4': 2.522689714263459, 'beta_5': -1.922391251784762, 'beta_6': -0.3705627723248339, 'beta_7': -1.2839530745995544}. Best is trial 0 with value: -27.893000000000004. [I 2021-07-28 18:33:15,545] Trial 4 finished with value: -25.292000000000005 and parameters: {'optimizer': 'COBYLA', 'reps': 9, 'gamma_0': -2.9620889361483695, 'gamma_1': -1.0134348392853898, 'gamma_2': -0.471471515902679, 'gamma_3': -2.192595618615822, 'gamma_4': 2.299315367886618, 'gamma_5': -0.40554650404284365, 'gamma_6': -0.6248416568443118, 'gamma_7': -1.3889756174263934, 'gamma_8': 1.5018543405101132, 'beta_0': -2.0770291105453014, 'beta_1': -3.1225424759939644, 'beta_2': 2.5154681815169457, 'beta_3': 0.5900764963830416, 'beta_4': -1.6205358789590627, 'beta_5': 0.4066612040660935, 'beta_6': -1.9894748554232176, 'beta_7': -2.413441332337296, 'beta_8': 0.6263873577336971}. Best is trial 0 with value: -27.893000000000004.
print(study.best_trial)
FrozenTrial(number=0, values=[-27.893000000000004], datetime_start=datetime.datetime(2021, 7, 28, 18, 13, 43, 409462), datetime_complete=datetime.datetime(2021, 7, 28, 18, 15, 10, 294149), params={'optimizer': 'COBYLA', 'reps': 8, 'gamma_0': -1.2567914611021997, 'gamma_1': -2.923328120889928, 'gamma_2': -2.334348935384091, 'gamma_3': 2.0219271092016227, 'gamma_4': 1.5453798379909172, 'gamma_5': -1.944999293004688, 'gamma_6': 2.5858628163447417, 'gamma_7': -0.42445712020817883, 'beta_0': 0.8455000340017493, 'beta_1': -1.484953735945104, 'beta_2': 0.783716490297818, 'beta_3': -1.809516968683277, 'beta_4': -1.216352667296713, 'beta_5': -2.6392011140632055, 'beta_6': 1.7969934507961671, 'beta_7': -2.781278882050769}, distributions={'optimizer': CategoricalDistribution(choices=('SPSA', 'COBYLA')), 'reps': IntUniformDistribution(high=10, low=1, step=1), 'gamma_0': UniformDistribution(high=3.141592653589793, low=-3.141592653589793), 'gamma_1': UniformDistribution(high=3.141592653589793, low=-3.141592653589793), 'gamma_2': UniformDistribution(high=3.141592653589793, low=-3.141592653589793), 'gamma_3': UniformDistribution(high=3.141592653589793, low=-3.141592653589793), 'gamma_4': UniformDistribution(high=3.141592653589793, low=-3.141592653589793), 'gamma_5': UniformDistribution(high=3.141592653589793, low=-3.141592653589793), 'gamma_6': UniformDistribution(high=3.141592653589793, low=-3.141592653589793), 'gamma_7': UniformDistribution(high=3.141592653589793, low=-3.141592653589793), 'beta_0': UniformDistribution(high=3.141592653589793, low=-3.141592653589793), 'beta_1': UniformDistribution(high=3.141592653589793, low=-3.141592653589793), 'beta_2': UniformDistribution(high=3.141592653589793, low=-3.141592653589793), 'beta_3': UniformDistribution(high=3.141592653589793, low=-3.141592653589793), 'beta_4': UniformDistribution(high=3.141592653589793, low=-3.141592653589793), 'beta_5': UniformDistribution(high=3.141592653589793, low=-3.141592653589793), 'beta_6': UniformDistribution(high=3.141592653589793, low=-3.141592653589793), 'beta_7': UniformDistribution(high=3.141592653589793, low=-3.141592653589793)}, user_attrs={'best': [-27.893000000000004, optimal function value: -35.0
optimal value: [0. 1. 0. 1. 0.]
status: SUCCESS, array([-0.25679146, -1.92332812, -2.33434894, 2.02192711, 1.54537984,
-1.94499929, 2.58586282, -0.42445712, 0.84550003, -1.48495374,
0.78371649, -1.80951697, -1.21635267, -2.63920111, 1.79699345,
-2.78127888])]}, system_attrs={}, intermediate_values={}, trial_id=0, state=TrialState.COMPLETE, value=None)
fig = optuna.visualization.plot_optimization_history(study)
fig.show()
mean, result, optimal_params = study.user_attrs["best"]
optimal_params
array([-0.25679146, -1.92332812, -2.33434894, 2.02192711, 1.54537984,
-1.94499929, 2.58586282, -0.42445712, 0.84550003, -1.48495374,
0.78371649, -1.80951697, -1.21635267, -2.63920111, 1.79699345,
-2.78127888])
max_cut.draw(result)
mean, distribution = max_cut.analyse(result, print_output=True)
plot_histogram(distribution, color='midnightblue', title=f"Expectation Value (Ø: {mean:.3f})")
optimal function value: -35.0 optimal value: [0. 1. 0. 1. 0.] status: SUCCESS Mean: -27.893000000000004 00000: value: 0.000, probability: 0.1% 11111: value: 0.000, probability: 0.2% 10010: value: -13.000, probability: 0.1% 10000: value: -15.000, probability: 1.3% 01111: value: -15.000, probability: 2.0% 00100: value: -16.000, probability: 4.8% 00010: value: -16.000, probability: 1.4% 11101: value: -16.000, probability: 1.9% 11011: value: -16.000, probability: 4.0% 01100: value: -17.000, probability: 0.9% 10011: value: -17.000, probability: 1.5% 01000: value: -19.000, probability: 3.8% 10111: value: -19.000, probability: 3.3% 10110: value: -29.000, probability: 7.0% 01001: value: -29.000, probability: 6.6% 11110: value: -30.000, probability: 1.7% 00001: value: -30.000, probability: 1.9% 10100: value: -31.000, probability: 1.9% 01011: value: -31.000, probability: 2.8% 11100: value: -32.000, probability: 2.7% 11010: value: -32.000, probability: 5.8% 00110: value: -32.000, probability: 7.0% 11001: value: -32.000, probability: 7.2% 00101: value: -32.000, probability: 7.6% 00011: value: -32.000, probability: 2.9% 01110: value: -33.000, probability: 5.3% 10001: value: -33.000, probability: 5.5% 11000: value: -34.000, probability: 2.7% 00111: value: -34.000, probability: 3.0% 01010: value: -35.000, probability: 1.2% 10101: value: -35.000, probability: 1.9%
import qiskit.tools.jupyter
%qiskit_version_table
| Qiskit Software | Version |
|---|---|
| Qiskit | 0.27.0 |
| Terra | 0.17.4 |
| Aer | 0.8.2 |
| Ignis | 0.6.0 |
| Aqua | 0.9.2 |
| IBM Q Provider | 0.14.0 |
| System information | |
| Python | 3.8.6 (default, Jan 22 2021, 11:41:28) [GCC 8.4.1 20200928 (Red Hat 8.4.1-1)] |
| OS | Linux |
| CPUs | 192 |
| Memory (Gb) | 6046.015735626221 |
| Wed Jul 28 18:33:16 2021 CEST | |
import mitiq
mitiq.about()
Mitiq: A Python toolkit for implementing error mitigation on quantum computers ============================================================================== Authored by: Mitiq team, 2020 & later (https://github.com/unitaryfund/mitiq) Mitiq Version: 0.9.3 Core Dependencies ----------------- Cirq Version: 0.10.0 NumPy Version: 1.20.3 SciPy Version: 1.4.1 Optional Dependencies --------------------- PyQuil Version: Not installed Qiskit Version: 0.27.0 Braket Version: Not installed Python Version: 3.8.6 Platform Info: Linux (x86_64)